package pool;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class PoolConexiones {

	
		 private static PoolConexiones instancia; 
		 private String driver, url, user, pass; 
		 private int nivelTransaccionalidad; 
		 private Conexion[] conexiones;
		 //private Connection [] conexiones; 
		 private int tamanio, creadas, tope=0; 
		 private PoolConexiones ()  
		 { 
			 Properties props = new Properties (); 
			 try 
			 { 
				
					
				 
				 
				 
				 props.load (new FileInputStream ("config/datos.properties")); 
				 url = props.getProperty ("url"); 
				 driver = props.getProperty ("driver"); 
				 user = props.getProperty ("user"); 
				 pass = props.getProperty ("password"); 
				 tamanio = 3;//Integer.parseInt (props.getProperty ("tamanio")); 
				 creadas = 0; 
				 nivelTransaccionalidad = 1;// Integer.parseInt (props.getProperty ("nivel")); 
				 Class.forName (driver); 
				 conexiones = new Conexion [tamanio]; 
			 } 
			 
				 catch (FileNotFoundException e) 
				 { 
					 System.out.println("error de persistencia ");
				 //throw new PersistenciaException ("error al crear el pool"); 
				 } 
				 catch (IOException e) 
				 { 
					 System.out.println("error de persistencia ");
				 //throw new PersistenciaException ("error al crear el pool"); 
				 } 
				 catch (ClassNotFoundException e) 
				 { 
					 System.out.println("error de persistencia ");
				 //throw new PersistenciaException ("error al crear el pool"); 
				 } 
			 } 

		 public static synchronized PoolConexiones getInstancia()  //throws PersistenciaException 
			 { 
			 	if (instancia == null) 
			 		instancia = new PoolConexiones (); 
				return instancia; 
			 } 

		 public synchronized Conexion obtenerConexion () 
				// throws PersistenciaException 
		 { 
			 Connection con = null; 
		 
				 while (con == null) 
				 { 
					 if (tope > 0) { 
						 con = conexiones [tope-1].getConnection(); 
						 tope--; 
					 	} 
						 else 
							 if (creadas < tamanio) 
								 try 
								 { 
									 con = DriverManager.getConnection (url,user,pass); 
									 con.setTransactionIsolation (nivelTransaccionalidad);
									 con.setAutoCommit (false);
									 creadas++; 
									 
								 } 
								 catch (SQLException e) 
								 { 
									 e.getMessage();
								 } 
								else 
								 try 
								 { 
									 wait (); 
								 } 
								 catch (InterruptedException e) 
								 { 
								 } 
						} 
				 Conexion cone = new Conexion(con);
				 return cone; 
			} 


		 public synchronized void liberarConexion (Conexion icon, boolean ok) // throws PersistenciaException 
		{ 
			 Conexion cone = new Conexion(icon.getConnection());
			try 
			{ 
				if (ok) 
				icon.getConnection().commit (); 
				else 
				icon.getConnection().rollback (); 
				
			} 
			catch (SQLException e) 
			{ 
				e.getMessage();
			} 
				 conexiones [tope] = cone; 
				 tope++; 
				 notify (); 
		} 
	}
	
	
	
	
	
	
	

